<?php
/*
===============================================================================
	Controla las funciones nesesarias para que los datos del archivo delimitado
	por comas sean guardados en su respectivo lugar en la base de datos.
===============================================================================
 */
class Archivo_CSV extends CI_Controller
{
	//Indices de columnas segun el archivo CSV.
	const COLUMNAS_NUM        = 14;
	const SEGUNDA_FILA        = 1;
	const CAMPU_COL           = 0;
	const CICLO_PERIODO_COL   = 1;
	const MATRICULA_COL       = 2;
	const NOMBRE_COL          = 3;
	const NIVEL_COL           = 4;
	const CARRERA_COL         = 5;
	const DOCENTE_COL         = 6;
	const NOMBRE_DOCENTE_COL  = 7;
	const CRN_COL             = 8;
	const GRUPO_COL           = 9;
	const MATERIA_COL         = 10;
	const NOMBRE_MATERIA_COL  = 11;
	const SEME_COL            = 12;
	const PRESENCIAL_COL      = 13;
	const TITULO              = 'Importar Datos';

	function Index(){
		$datos['contenido']   = 'Cargar_CSV';
		$datos['titulo']      = self::TITULO;
		$this->load->view('/includes/template',$datos);
	}

	/*
	====================
	Cargar_CSV

	Verifica que la extension del archivo es .csv.
	Define los encabezados de las columnas del archivo. Despues lee cada uno de los registros del CSV y los guarda en un arreglo multidimensional.
	Si coinciden cada uno de los encabezados, continua llamando los metodos para cargar los registros a cada una de las tablas individualmente.
	====================
	*/
	function Cargar_CSV()
	{
		//Nombre de los campos no deben de contener espacios
		$encabezado = Array('Campu','Periodo','Cuenta','Alumno','Nivel','Carrer','Docente','NombreDocente','CRN','Grupo','Materia','NombreMateria','Seme','Modalidad');
		$encabezado_ok = TRUE;
		$dir_CSV = $_FILES['selectCSV']['tmp_name'];
		$ext = pathinfo($_FILES['selectCSV']['name'], PATHINFO_EXTENSION);
		if ( $ext == "csv" ) {
			$CSV = fopen($dir_CSV,'r');
			while ( ($linea = fgetcsv($CSV)) !== FALSE ) {
		  		$CSV_arreglo[] = $linea;
			}
			//Validar Encabezado
			for ( $i=0; $i < self::COLUMNAS_NUM; $i++ ) {
				if( $CSV_arreglo[0][$i] != $encabezado[$i] ){
					$encabezado_ok = FALSE;
				}
			}
			if ( $encabezado_ok ) {
				DEFINE('NUM_FILAS',COUNT($CSV_arreglo));
				if ( $this->_CargarAlumnos($CSV_arreglo) ) {
					if ( $this->_CargarMaestros($CSV_arreglo) ) {
						if ( $this->_CargarMaterias($CSV_arreglo) ) {
							if ( $this->_CargarCursos($CSV_arreglo) ) {
								if ( $this->_CargarMateAlum($CSV_arreglo) ) {
									$this->session->set_flashdata('aviso','TRUE');
									$this->session->set_flashdata('avisoText','Archivo Cargado Exitosamente');
								}
							}
						}
					}
				}
			} else {
				$this->session->set_flashdata('aviso', 'FALSE');
				$this->session->set_flashdata('avisoText', 'Verificar que el encabezado de las columnas del archivo CSV');
			}
		} else {
			$this->session->set_flashdata('aviso', 'FALSE');
			$this->session->set_flashdata('avisoText', 'Verificar que el archivo contenga extension CSV');
		}
		@fclose($CSV);
		redirect('Archivo_CSV');
	}

	/*
	====================
	_CargarAlumnos

	Recorre el archivo CSV registro por registro. Mandando para insertar 1 registro cada ciclo.
	Se codifica el nombre de alumno en UTF - 8 para que se reconozcan los caracteres especiales.
	====================
	*/
	function _CargarAlumnos($datosArreglo)
	{
		for ( $i=self::SEGUNDA_FILA; $i < NUM_FILAS; $i++ ) {
			$datosAlumnos = array(
				'matricula' => $datosArreglo[$i][self::MATRICULA_COL],
				'alumno'    => utf8_encode($datosArreglo[$i][self::NOMBRE_COL])
				);
			$this->Alumnos_Model->AgregarRegistrosAlumnos($datosAlumnos);
		}
		return TRUE;
	}

	/*
	====================
	_CargarMaestros

	Recorre el archivo CSV registro por registro. Mandando para insertar 1 registro cada ciclo.
	Se codifica el nombre de maestro en UTF - 8 para que se reconozcan los caracteres especiales.
	====================
	*/
	function _CargarMaestros($datosArreglo)
	{
		for ( $i=self::SEGUNDA_FILA; $i < NUM_FILAS; $i++ ) {
			$datosMaestros = array(
				'id'     => $datosArreglo[$i][self::DOCENTE_COL] ,
				'nombre' => utf8_encode($datosArreglo[$i][self::NOMBRE_DOCENTE_COL])
				);
			$this->Maestros_Model->AgregarRegistrosMaestros($datosMaestros);
		}
		return TRUE;
	}

	/*
	====================
	_CargarMaterias

	Recorre el archivo CSV registro por registro. Mandando para insertar 1 registro cada ciclo.
	Se codifica el nombre de materia en UTF - 8 para que se reconozcan los caracteres especiales.
	====================
	*/
	function _CargarMaterias($datosArreglo)
	{
		for ( $i=self::SEGUNDA_FILA; $i < NUM_FILAS; $i++ ) {
			$datosMaterias = array(
				'clave'  =>$datosArreglo[$i][self::MATERIA_COL] ,
				'nombre' => utf8_encode($datosArreglo[$i][self::NOMBRE_MATERIA_COL])
				);
			$this->Materia_Model->AgregarRegistrosMaterias($datosMaterias);
		}
		return TRUE;
	}

	/*
	====================
	_CargarCursos

	Recorre el archivo CSV registro por registro, verificando si este curso ya esta dado de alta.
	En dado caso que aun no este dado de alta, este  genera un arreglo y lo manda a guardar en la base de datos.
	====================
	*/
	function _CargarCursos($datosArreglo)
	{
		for ( $i=self::SEGUNDA_FILA; $i < NUM_FILAS; $i++ ) {
			if ( !$this->_ExistirCurso( $datosArreglo[$i] ) ) {
				$datosCursos = array(
					'maestro' 		  => $datosArreglo[$i][self::DOCENTE_COL] ,
					'grupo' 		  => $datosArreglo[$i][self::GRUPO_COL] ,
					'materia' 		  => $datosArreglo[$i][self::MATERIA_COL] ,
					'id_ciclo' 		  => $datosArreglo[$i][self::CICLO_PERIODO_COL] ,
					'periodo' 		  => $datosArreglo[$i][self::CICLO_PERIODO_COL] ,
					'fecha_insertado' => DATE('Y-m-d') ,
					'presencial' 	  => $datosArreglo[$i][self::PRESENCIAL_COL]
					);
				$this->Cursos_Model->AgregarRegistrosCursos($datosCursos);
			}
		}
		return TRUE;
	}

	/*
	====================
	_ExistirCurso

	Obtiene el maestro, materia y periodo de todos los registros de cursos existentes en la base de datos y los guarda en un arreglo multidimensional.
	Compara cada uno de los registros del archivo CSV asi mismo se conoce si el curso ya existe en la base de datos.
	====================
	*/
	function _ExistirCurso( $datosCursos )
	{
		$res = $this->Cursos_Model->ObtenerTodos();
		if ( $res ) {
			foreach ( $res as $fila ) {
				if ( $fila->maestro == $datosCursos[self::DOCENTE_COL] && $fila->materia == $datosCursos[self::MATERIA_COL] && $fila->periodo == $datosCursos[self::CICLO_PERIODO_COL] ) {
					return TRUE;
				}
			}
		} else {
			return FALSE;
		}
	}

	/*
	====================
	_ExistirRelacion

	Obtiene la matricula, materia, grupo y periodo de todos los registros de cursos existentes en la base de datos y los guarda en un arreglo multidimensional.
	Compara cada uno de los registros del archivo CSV asi mismo se conoce si la relacion entre curso y estudiante ya existe en la base de datos.
	====================
	*/
	function _ExistirRelacion($datosCursos)
	{
		$res = $this->Cursos_Model->ObtenerTodosRelacion();
		if ( $res ) {
			foreach ( $res as $fila ) {
				$i = 0;
				if ( $fila->matricula == $datosCursos[self::MATRICULA_COL] && $fila->materia == $datosCursos[self::MATERIA_COL] && $fila->ciclo == $datosCursos[self::CICLO_PERIODO_COL] && $fila->grupo == $datosCursos[self::GRUPO_COL] ) {
					return TRUE;
				}
			}
		} else {
			return FALSE;
		}
	}

	/*
	====================
	_CargarMateAlum

	Recorre el archivo CSV registro por registro. Mandando para insertar 1 registro cada ciclo.
	Tambien manda a llamar un proceso almacenado, este actualiza el identificador de cursos
	en la relacion Materia-Alumnos.
	====================
	*/
	function _CargarMateAlum($datosArreglo)
	{
		for ( $i=self::SEGUNDA_FILA; $i < NUM_FILAS; $i++ ) {
			if ( !$this->_ExistirRelacion($datosArreglo[$i]) ) {
				$datosMateAlum[] = array(
					'matricula' => $datosArreglo[$i][self::MATRICULA_COL] ,
					'grupo' 	=> $datosArreglo[$i][self::GRUPO_COL] ,
					'materia' 	=>$datosArreglo[$i][self::MATERIA_COL] ,
					'ciclo' 	=> $datosArreglo[$i][self::CICLO_PERIODO_COL]
					 );
			}
		}
		$this->Alumnos_Model->AgregarRegistrsoMateAlum($datosMateAlum);
		$this->Alumnos_Model->ActualizarIdCursoMateAlum();
		return TRUE;
	}
}
?>